package br.com.edoc.validador;

import java.lang.reflect.Field;
import ognl.Ognl;
import ognl.OgnlException;
import br.com.edoc.anotation.DipValidationField;
import br.com.edoc.entidade.EntidadePadrao;
import br.com.edoc.excecoes.ExceptionValidador;
import br.com.edoc.util.TratamentoClass;

public class ValidadorDefault {
	
	public void valida(Object obj) throws ExceptionValidador {
		Field atributosClasse[] = obj.getClass().getDeclaredFields();
		try {
			/**
			 * for que valida os campos 
			 * */
			for(int i =0; i < atributosClasse.length; i++){
				DipValidationField anotationVlida = atributosClasse[i].getAnnotation(DipValidationField.class);
				if(anotationVlida!=null){
					if(anotationVlida.obrigatorio()){
						objIsNull(atributosClasse[i], obj);
						System.out.println("Atributo "+atributosClasse[i].getName()+" é  obrigatorio");
						if(anotationVlida.tamanhoMaximo()!=-1 || anotationVlida.tamanhoMinimo()!=-1){
							validarTamanho(atributosClasse[i], obj, anotationVlida);
						}

					}else{
						System.out.println("Atributo "+atributosClasse[i].getName()+" não  obrigatorio");
					}
				}
			}
		} catch (OgnlException e) {
			// TODO Auto-generated catch block
			throw new ExceptionValidador(e);
		}
	}
	
	public void objIsNull(Field atributosClasse ,Object obj) throws OgnlException, ExceptionValidador{
		try {
			DipValidationField dipDefault = atributosClasse.getAnnotation(DipValidationField.class);
			if(Ognl.getValue(atributosClasse.getName(), obj)==null){
					throw new  ExceptionValidador(dipDefault.msgObrigatoriedade());
			}
			else if(TratamentoClass.getNameClass(atributosClasse.getType()).equals("String")){
				String valor =(String) Ognl.getValue(atributosClasse.getName(), obj);
				if(valor==null || valor.equals("")){
					throw new  ExceptionValidador(dipDefault.msgObrigatoriedade());
				}
			}else{
				if(Ognl.getValue(atributosClasse.getName(), obj) instanceof EntidadePadrao){
					EntidadePadrao entidade = (EntidadePadrao) Ognl.getValue(atributosClasse.getName(), obj);
					if(entidade.getId()==null){
						throw new  ExceptionValidador(dipDefault.msgObrigatoriedade());
					}
				}
			}
		} catch (OgnlException e) {
			// TODO Auto-generated catch block
			throw new OgnlException("Erro externo:"+e.getMessage(),e);
		}

	}
	
	public void validarTamanho(Field atributosClasse,Object obj,DipValidationField dipValida) throws ExceptionValidador, OgnlException{
		if(TratamentoClass.getNameClass(atributosClasse.getType()).equals("String")){
			try {
				String valor = (String) Ognl.getValue(atributosClasse.getName(), obj);
				if(dipValida.tamanhoMaximo()!=-1 && dipValida.tamanhoMaximo()<valor.length()){
					throw new ExceptionValidador(dipValida.msgEstoroTamanho());
				}
				if(dipValida.tamanhoMinimo()!=-1 && dipValida.tamanhoMinimo()>valor.length()){
					throw new ExceptionValidador(dipValida.msgEstoroTamanho());
				}
			} catch (OgnlException e) {
				// TODO Auto-generated catch block
				throw new OgnlException("Erro externo:"+e.getMessage(),e);
			}
		}else if(TratamentoClass.getNameClass(atributosClasse.getType()).equals("Integer")){
			Integer valor = (Integer) Ognl.getValue(atributosClasse.getName(), obj);
			if(dipValida.tamanhoMaximo()!=-1 && dipValida.tamanhoMaximo()<=valor){
				throw new ExceptionValidador(dipValida.msgEstoroTamanho());
			}
			if(dipValida.tamanhoMinimo()!=-1 && dipValida.tamanhoMinimo()>=valor){
				throw new ExceptionValidador(dipValida.msgEstoroTamanho());
			}
		}
	}
}